// 用户登录vuex模块

import { getToken, setToken, removeToken, setTimeStamp } from '@/utils/auth'

import { login, getUserInfo, getUserDetailById } from '@/api/user'

import { resetRouter } from '@/router'

//state对象——保存具体的数据
const state = {
  token: getToken(), // 设置token初始状态 token持久化 => 放到缓存中
  userInfo: {} // 定义一个空的对象
}

//mutations对象——修改state中的数据
const mutations = {
  // 第一个setToken是mutations方法
  setToken(state, token) {
    state.token = token // 设置state中的token
    setToken(token) // vuex和 缓存数据的同步
  },
  // 删除token
  removeToken(state) {
    // 设置state中的也要清空
    state.token = null
    // 删除cookie中的token
    removeToken()
  },
  // 获取用户资料
  setUserInfo(state, userInfo) {
    // 响应式赋值,返回的参数有很多，挨个一个个传递给state.userinfo，类似迭代器
    state.userInfo = { ...userInfo }
  },
   // 删除用户信息资料
   removeUserInfo(state) {
    state.userInfo = {}
  }
}

//actions对象——响应组件中用户的动作、逻辑业务
const actions ={
  // 执行用户登录
  // 定义login action  也需要参数 调用action时 传递过来的参数
  async login(context, data) {

    const token = await login(data) // 实际上就是一个promise  result就是执行的结果
     // 表示登录接口调用成功 也就是意味着你的用户名和密码是正确的
     // 现在有用户token
     // actions 修改state 必须通过mutations
     context.commit('setToken', token)

     // 登录时写入时间戳
    setTimeStamp() // 将当前的最新时间写入缓存 
 },
 // 获取用户资料action
 async getUserInfo (context) {
   const result = await getUserInfo()  // 调api获取用户详细信息
   const baseInfo = await getUserDetailById(result.userId) // 调api获取头像
   const baseResult = { ...result, ...baseInfo } // 结果合并
   context.commit('setUserInfo', baseResult) // 将整个的个人信息设置到用户的vuex数据中
   return baseResult // 这里为什么要返回 为后面埋下伏笔,--权限分配
 },
// 登出
//  logout(context){
//   context.commit('removeToken') // 不仅仅删除了vuex中的 还删除了缓存中的
//   context.commit('removeUserInfo') // 删除用户信息资料
//  }
 // 登出的action
 logout(context) {
  // 删除token
  context.commit('removeToken') // 不仅仅删除了vuex中的 还删除了缓存中的
  // 删除用户资料
  context.commit('removeUserInfo') // 删除用户信息
  // 重置路由
  resetRouter()
  // 还有一步  vuex中的数据是不是还在
  // 要清空permission模块下的state数据
  // vuex中 user子模块  permission子模块
  // 子模块调用子模块的action  默认情况下 子模块的context是子模块的
  // 父模块 调用 子模块的action
  context.commit('permission/setRoutes', [], { root: true })
  // 子模块调用子模块的action 可以 将 commit的第三个参数 设置成  { root: true } 就表示当前的context不是子模块了 而是父模块
  // !!!!同级调用
}
}
// const actions = {
//   // 执行用户登录
//   async login(context, data) {
//     // 必须等待login异步拿到data之后
//     // login(data)---就是api接口--成功返回token
//     const token = await login(data) // 实际上就是一个promise  result就是执行的结果
//       context.commit('setToken', token)
//   },
//    // 获取用户资料action
//    async getUserInfo (context) {
//     const result = await getUserInfo()  // 调用api接口获取返回值
//     context.commit('setUserInfo', result) // 提交到mutaions的vuex数据中
//     return result // 返回 为后面埋下伏笔
//   }
// }

//创建并暴露store-user
export default {
  // namespaced 命名空间互不干扰
  namespaced: true,
  state,
  mutations,
  actions
}

